home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / mricon / source / vdb.c < prev   
Encoding:
C/C++ Source or Header  |  1991-10-19  |  17.6 KB  |  856 lines

  1. #include    "defs.h"
  2.  
  3. #define    MAX_CON    2
  4.  
  5. UCHAR        CHK_VRAM = 1;
  6. UCHAR        ACT_DSP = FALSE;
  7. SHORT        ACT_CON = 0;
  8. SHORT        DSP_CON = 0;
  9. SHORT        ACT_CVRAM=0xC800;
  10. SHORT        ACT_KVRAM=0xCA00;
  11. SHORT        CUR_OLD_XY = 0xFFFF;
  12. SHORT        CUR_DISP_X = 0;
  13. SHORT        CUR_DISP_Y = 0;
  14. SHORT        CUR_DISP_OFF = 14;
  15. SHORT        CUR_DISP_SIZ = 2;
  16. UCHAR        CUR_DISP_FLG = 0;
  17. CONPARA        consol[MAX_CON]={
  18.         {
  19.         0xC800,        /* cvram */
  20.         0xCA00,        /* kvram */
  21.         0,        /* cur_x */
  22.         0,        /* cur_y */
  23.         0x30,        /* cur_type */
  24.         14,        /* cur_off */
  25.         2,        /* cur_siz */
  26.         0,        /* cur_flg */
  27.         0xCE,        /* com_mode */
  28.         MAX_Y,        /* scr_y */
  29.         7,        /* color */
  30.         0,        /* bakcol */
  31.         FALSE,        /* tabflg */
  32.         TRUE,        /* odr_flg */
  33.         TRUE,        /* kanmod */
  34.         0,        /* bakch1 */
  35.         0,        /* kancod */
  36.         FALSE,        /* extflg */
  37.         0,        /* esccnt */
  38.         0,        /* bak_x */
  39.         0,        /* bak_y */
  40.         0,        /* (*extpro)() */
  41.         { 0 },        /* tabmap[MAX_X/8] */
  42.         { 0 },        /* escprm[ESPSIZ] */
  43.         },
  44.         {
  45.         0xC800,        /* cvram */
  46.         0xCA00,        /* kvram */
  47.         0,        /* cur_x */
  48.         0,        /* cur_y */
  49.         0x30,        /* cur_type */
  50.         14,        /* cur_off */
  51.         2,        /* cur_siz */
  52.         0,        /* cur_flg */
  53.         0xCE,        /* com_mode */
  54.         MAX_Y,        /* scr_y */
  55.         7,        /* color */
  56.         0,        /* bakcol */
  57.         FALSE,        /* tabflg */
  58.         TRUE,        /* odr_flg */
  59.         TRUE,        /* kanmod */
  60.         0,        /* bakch1 */
  61.         0,        /* kancod */
  62.         FALSE,        /* extflg */
  63.         0,        /* esccnt */
  64.         0,        /* bak_x */
  65.         0,        /* bak_y */
  66.         0,        /* (*extpro)() */
  67.         { 0 },        /* tabmap[MAX_X/8] */
  68.         { 0 },        /* escprm[ESPSIZ] */
  69.         }
  70.     };
  71. REGSET far  *regs;
  72. CONPARA        *actv=consol;
  73.  
  74. /**************************************************************
  75.     CONSOL BIOS (int 91h) 
  76. ***************************************************************/
  77. void    VDB_00(void)    /* 初期化 */
  78. {
  79.     SCR_Y = MAX_Y - 1;
  80.     CUR_FLG = 0;
  81.     COM_MODE = 0xCE;
  82.     CUR_X = CUR_Y = 0;
  83.     COLOR = 7;
  84.     colset(0,COLOR,(MAX_X * 2) * MAX_Y);
  85.     Con_init();
  86. }
  87. void    VDB_01(void)
  88. {
  89. }    /* 画面の表示制御 */
  90.  
  91. void    VDB_02(void)    /* 全画面消去 */
  92. {
  93.     colset(0,COLOR,(MAX_X * 2) * MAX_Y);
  94.     CUR_X = CUR_Y = 0;
  95. }
  96. void     VDB_03(void)    /* 表示画面サイズの設定 */
  97. {
  98.     if ( (SCR_Y = U_DH) > MAX_Y )
  99.     SCR_Y = MAX_Y;
  100.     if ( (COM_MODE & 0x40) != 0 )
  101.     SCR_Y--;
  102. }
  103. void     VDB_04(void)    /* 表示画面サイズの読み取り */
  104. {
  105.     U_DL = SCR_X;
  106.     U_DH = SCR_Y;
  107. }
  108. void    VDB_05(void)    /* 表示画面サイズレパ-トリの読み取り */
  109. {
  110.     union {
  111.     UCHAR far    *p;
  112.     unsigned short  s[2];
  113.     } ptr;
  114.  
  115.     ptr.s[0] = U_DI;
  116.     ptr.s[1] = U_DS;
  117.  
  118.     if ( *(ptr.p++) < 4 )
  119.     return;
  120.     *(ptr.p++) = 1;
  121.     *(ptr.p++) = 80;
  122.     *(ptr.p++) = 25;
  123. }
  124. void     VDB_06(void)    /* アトリビュート機能範囲の読み取り */
  125. {
  126.     union {
  127.     UCHAR far    *p;
  128.     unsigned short  s[2];
  129.     } ptr;
  130.  
  131.     ptr.s[0] = U_DI;
  132.     ptr.s[1] = U_DS;
  133.  
  134.     *(ptr.p++) = 0x03;    /* 漢字識別可能 */
  135.     *(ptr.p++) = 0x38;    /* リバ-ス & 強調 */
  136.     *(ptr.p++) = 0x07;    /* 最大色数 */
  137.     *(ptr.p) = 0;
  138. }
  139. void    VDB_07(void)    /* フォントパタ-ンの取り出し */
  140. {
  141.     int     i;
  142.     union {
  143.     UCHAR far    *p;
  144.     unsigned short  s[2];
  145.     } ptr,fnt;
  146.  
  147.     ptr.s[0] = U_DI;
  148.     ptr.s[1] = U_DS;
  149.  
  150.     if ( U_BH == 0 ) {    /* ANK 8x8 or 8x16 */
  151.     if ( U_DH != 8 )
  152.         goto ERROR;
  153.     else if ( U_DL == 8 ) {
  154.         fnt.s[0] = U_BL * 8;
  155.         fnt.s[1] = 0xCA00;
  156.         outp(0xFF99,1);
  157.         for ( i = 0 ; i < 8 ; i++ )
  158.         *(ptr.p++) = *(fnt.p++);
  159.         outp(0xFF99,0);
  160.         return;
  161.     } else if ( U_DL == 16 ) {
  162.         fnt.s[0] = U_BL * 16;
  163.         fnt.s[1] = 0xCB00;
  164.         outp(0xFF99,1);
  165.         for ( i = 0 ; i < 16 ; i++ )
  166.         *(ptr.p++) = *(fnt.p++);
  167.         outp(0xFF99,0);
  168.         return;
  169.     } else
  170.         goto ERROR;
  171.     } else if ( U_DX == 0x1010 ) {    /* Kanji 16x16 */
  172.         outp(0xFF94,U_BL);
  173.         outp(0xFF95,U_BH);
  174.     for ( i = 0 ; i < 16 ; i++ ) {
  175.         *(ptr.p++) = inp(0xFF96);
  176.         *(ptr.p++) = inp(0xFF97);
  177.     }
  178.     return;
  179.     }
  180. ERROR:
  181.     U_AH = 0x02;
  182.     U_CF |= 0x0001;
  183. }
  184. void    VDB_08(void)    /* 外字パタ-ンの登録 */
  185. {
  186. }
  187. void    VDB_09(void)    /* カ-ソル形状の設定 */
  188. {
  189.     switch(U_AL & 0x0F) {
  190.     case 0: CUR_OFF = 14; CUR_SIZ = 2; break;
  191.     case 1: CUR_OFF = 0;  CUR_SIZ = 16; break;
  192.     case 15: CUR_OFF = U_DH;
  193.          CUR_SIZ = U_DL - CUR_OFF;
  194.         if ( CUR_OFF < 0 || CUR_OFF > 15 )
  195.             CUR_OFF = 15;
  196.         if ( CUR_SIZ < 0 || (CUR_SIZ + CUR_OFF) > 16 )
  197.             CUR_SIZ = 16 - CUR_OFF;
  198.         break;
  199.     }
  200.     CUR_FLG = ((U_AL & 0x60) == 0x20 ? 1:0);
  201.     CUR_TYPE = U_AL;
  202.     CUR_OLD_XY = 0xFFFF;
  203. }
  204. void    VDB_0A(void)    /* カ-ソル形状の読み取り */
  205. {
  206.     U_AL = CUR_TYPE;
  207.     U_DH = CUR_OFF;
  208.     U_DL = CUR_OFF + CUR_SIZ;
  209. }
  210. void    VDB_0B(void)    /* カ-ソル表示状態の設定 */ 
  211. {
  212.     CUR_FLG = U_AL;
  213. }
  214. void    VDB_0C(void)    /* カ-ソル表示状態の読み取り */
  215. {
  216.     U_AL = CUR_FLG;
  217. }
  218. void    VDB_0D(void)    /* カーソル位置の指定 */
  219. {
  220.     CUR_X = U_DL - 1;
  221.     CUR_Y = U_DH - 1;
  222.     if ( CUR_X < 0 ) CUR_X = 0;
  223.     if ( CUR_X >= SCR_X ) CUR_X = SCR_X - 1;
  224.     if ( CUR_Y < 0 ) CUR_Y = 0;
  225.     if ( CUR_Y >= MAX_Y ) CUR_Y = MAX_Y - 1;
  226. }
  227. void     VDB_0E(void)    /* カーソル位置の読み取り */
  228. {
  229.     U_DL = CUR_X + 1;
  230.     U_DH = CUR_Y + 1;
  231. }
  232. void    VDB_0F(void)    /* アトリビュートの設定 */
  233. {
  234.     int    at,x,y;
  235.     union {
  236.     UCHAR far    *p;
  237.     unsigned short  s[2];
  238.     } ptr,vrm;
  239.  
  240.     x = U_DL - 1;
  241.     y = U_DH - 1;
  242.  
  243.     vrm.s[1] = CVRAM;
  244.     vrm.s[0] = (x * 2 + (MAX_X * 2) * y + 1);
  245.  
  246.     ptr.s[1] = U_DS;
  247.     ptr.s[0] = (U_DI + 1);
  248.     at = *vrm.p & 0xC0;
  249.     *vrm.p = at | (*ptr.p & 0x38) | (*(ptr.p+1) & 0x07);
  250. }
  251. void    VDB_10(void)    /* アトリビュートの読み取り */
  252. {
  253.     int    at,x,y;
  254.     union {
  255.     UCHAR far    *p;
  256.     unsigned short  s[2];
  257.     } ptr,vrm;
  258.  
  259.     x = U_DL - 1;
  260.     y = U_DH - 1;
  261.  
  262.     vrm.s[1] = CVRAM;
  263.     vrm.s[0] = (x * 2 + (MAX_X * 2) * y + 1);
  264.     ptr.s[1] = U_DS;
  265.     ptr.s[0] = U_DI;
  266.  
  267.     if ( (*vrm.p & 0x40) != 0 )
  268.     *ptr.p = 0x01;
  269.     else if ( x > 0 && (*(vrm.p-2) & 0x40) != 0 ) {
  270.     *ptr.p = 0x03;
  271.     vrm.p -= 2;
  272.     } else
  273.     *ptr.p = 0x00;
  274.  
  275.     *(++ptr.p) = *vrm.p & 0x38;
  276.     *(++ptr.p) = *vrm.p & 0x07;
  277. }
  278. void    VDB_11(void)    /* デフォルトアトリビュ-トの設定 */
  279. {
  280.     union {
  281.     UCHAR far    *p;
  282.     unsigned short  s[2];
  283.     } ptr;
  284.  
  285.     ptr.s[0] = U_DI;
  286.     ptr.s[1] = U_DS;
  287.  
  288.     COLOR = (*(++ptr.p) & 0x38);
  289.     COLOR |= (*(++ptr.p) & 0x07);
  290. }
  291. void    VDB_12(void)    /* デフォルトアトリビュ-トの読み取り */
  292. {
  293.     union {
  294.     UCHAR far    *p;
  295.     unsigned short  s[2];
  296.     } ptr;
  297.  
  298.     ptr.s[0] = U_DI;
  299.     ptr.s[1] = U_DS;
  300.  
  301.     *(++ptr.p) = COLOR & 0x38;
  302.     *(++ptr.p) = COLOR & 0x07;
  303. }
  304. void    VDB_13(void)    /* 文字設定 */
  305. {
  306.     int    ch,x,y;
  307.     union {
  308.     UCHAR far    *p;
  309.     unsigned short  s[2];
  310.     } ptr;
  311.  
  312.     x = U_DL - 1;
  313.     y = U_DH - 1;
  314.     ch = U_BL;
  315.  
  316.     ptr.s[0] = (x * 2 + (MAX_X * 2) * y);
  317.     ptr.s[1] = CVRAM;
  318.  
  319.     *(ptr.p++) = ch;
  320.     if ( U_AL != 1 )
  321.     *ptr.p = COLOR;
  322.     else
  323.     *ptr.p &= 0x3F;
  324.     if ( U_BH == 0x01 )
  325.     *ptr.p |= 0x40;
  326.     else if ( U_BH == 0x03 ) {
  327.     ch |= (*(ptr.p-3) << 8);
  328.     *(ptr.p-1) = *(ptr.p-3) = DMYKAN;
  329.         ptr.s[1] = KVRAM;
  330.     *(ptr.p-3) = ch >> 8;
  331.     *(ptr.p-2) = ch;
  332.     }
  333. }
  334. void    VDB_14(void)    /* 文字読み取り */
  335. {
  336.     int    at,x,y;
  337.     union {
  338.     UCHAR far    *p;
  339.     unsigned short  s[2];
  340.     } ptr;
  341.  
  342.     x = U_DL - 1;
  343.     y = U_DH - 1;
  344.  
  345.     ptr.s[1] = CVRAM;
  346.     ptr.s[0] = (x * 2 + (MAX_X * 2) * y);
  347.  
  348.     if ( (*(ptr.p+1) & 0x40) != 0 ) {
  349.     U_BH = 0x01;
  350.         ptr.s[1] = KVRAM;
  351.         U_BL = *ptr.p;
  352.  
  353.     } else if ( x > 0 && (*(ptr.p-1) & 0x40) != 0 ) {
  354.     U_BH = 0x03;
  355.         ptr.s[1] = KVRAM;
  356.         U_BL = *(ptr.p-1);
  357.  
  358.     } else {
  359.     U_BH = 0x00;
  360.         U_BL = *ptr.p;
  361.     }
  362. }
  363. void    VDB_15(void)    /* 矩形域設定 */
  364. {
  365.     int     cx,ch;
  366.     int     x1,y1,x2,y2;
  367.     int     x,y,sx,sy;
  368.     union {
  369.     UNSIG far    *p;
  370.     unsigned short  s[2];
  371.     } pp;
  372.     union {
  373.     UCHAR far    *p;
  374.     unsigned short  s[2];
  375.     } cp,ap,sp,vp;
  376.  
  377.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0)
  378.     goto ERROR;
  379.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  380.     goto ERROR;
  381.     if ( (x2 = U_BL) > MAX_X )
  382.     goto ERROR;
  383.     if ( (y2 = U_BH) > SCR_Y )
  384.     goto ERROR;
  385.     sx = x2 - x1; sy = y2 - y1;
  386.     if ( sx <= 0 || sy <= 0 )
  387.     goto ERROR;
  388.  
  389.     sp.s[0] = (x1 * 2 + (MAX_X * 2) * y1);
  390.     sp.s[1] = CVRAM;
  391.  
  392.     pp.s[0] = U_DI;
  393.     pp.s[1] = U_DS;
  394.  
  395.     cp.s[0] = *(pp.p++);
  396.     cp.s[1] = *(pp.p++);
  397.  
  398.     ap.s[0] = *(pp.p++);
  399.     ap.s[1] = *(pp.p++);
  400.  
  401.     for ( y = 0 ; y < sy ; y++ ) {
  402.     for ( x = 0,vp.p = sp.p ; x < sx ; x++ ) {
  403.         *(vp.p++) = *(cp.p++);
  404.         if ( *(ap.p++) == 0x03 ) {
  405.         *(vp.p-2) |= 0x40;
  406.         ch = *(vp.p-3) << 8 | *(vp.p-1);
  407.         vp.s[1] = KVRAM;
  408.         *(vp.p-3) = ch >> 8;
  409.         *(vp.p-2) = ch;
  410.         vp.s[1] = CVRAM;
  411.         } else
  412.         *vp.p &= 0x3F;
  413.         if ( U_AL == 1 ) {
  414.         *vp.p = *(ap.p++) & 0x38;
  415.         *vp.p |= *(ap.p++) & 0x07;
  416.         ap.p++;
  417.         }
  418.         vp.p++;
  419.     }
  420.     sp.p += (MAX_X * 2);
  421.     }
  422.     return;
  423. ERROR:
  424.     U_AH = 0x02;
  425.     U_CF |= 0x0001;
  426. }
  427. void    VDB_16(void)        /* 矩形域読み取り */
  428. {
  429.     int     i;
  430.     int     x1,y1,x2,y2;
  431.     int     x,y,sx,sy;
  432.     union {
  433.     UNSIG far    *p;
  434.     unsigned short  s[2];
  435.     } pp;
  436.     union {
  437.     UCHAR far    *p;
  438.     unsigned short  s[2];
  439.     } cp,ap,sp,vp;
  440.  
  441.     if ( (x1 = U_DL-1) >= MAX_X || x1 < 0)
  442.     goto ERROR;
  443.     if ( (y1 = U_DH-1) >= SCR_Y || y1 < 0 )
  444.     goto ERROR;
  445.     if ( (x2 = U_BL) > MAX_X )
  446.     goto ERROR;
  447.     if ( (y2 = U_BH) > SCR_Y )
  448.     goto ERROR;
  449.     sx = x2 - x1; sy = y2 - y1;
  450.     if ( sx <= 0 || sy <= 0 )
  451.     goto ERROR;
  452.  
  453.     sp.s[0] = (x1 * 2 + (MAX_X * 2) * y1);
  454.     sp.s[1] = CVRAM;
  455.  
  456.     pp.s[0] = U_DI;
  457.     pp.s[1] = U_DS;
  458.  
  459.     cp.s[0] = *(pp.p++);
  460.     cp.s[1] = *(pp.p++);
  461.  
  462.     ap.s[0] = *(pp.p++);
  463.     ap.s[1] = *(pp.p++);
  464.  
  465.     for ( y = 0 ; y < sy ; y++ ) {
  466.     for ( x = 0,vp.p = sp.p ; x < sx ; x++ ) {
  467.         *(cp.p++) = *(vp.p++);
  468.         if ( (*vp.p & 0x40) != 0 ) {
  469.         *(ap.p++) = 0x01;
  470.         vp.s[1] = KVRAM;
  471.         *(cp.p-1) = *(vp.p-1);
  472.         vp.s[1] = CVRAM;
  473.         } else if ( x > 0 && (*(vp.p-2) & 0x40) != 0 ) {
  474.         *(ap.p++) = 0x03;
  475.         vp.s[1] = KVRAM;
  476.         *(cp.p-1) = *(vp.p-2);
  477.         vp.s[1] = CVRAM;
  478.         } else
  479.         *(ap.p++) = 0x00;
  480.         if ( U_AL == 1 ) {
  481.         *(ap.p++) = *vp.p & 0x38;
  482.         *(ap.p++) = *vp.p & 0x07;
  483.         ap.p++;
  484.         }
  485.         vp.p++;
  486.     }
  487.     sp.p += (MAX_X * 2);
  488.     }
  489.     return;
  490. ERROR:
  491.     U_AH = 0x02;
  492.     U_CF |= 0x0001;
  493. }
  494. void    VDB_17(void)    /* 矩形域複写 */
  495. {
  496.     int     i;
  497.     int     x1,y1,x2,y2,x3,y3;
  498.     int     sx,sy;
  499.     UNSIG   sp;
  500.     UNSIG   dp;
  501.  
  502.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  503.     goto ERROR;
  504.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  505.     goto ERROR;
  506.     if ( (x2 = U_BL) > MAX_X )
  507.     goto ERROR;
  508.     if ( (y2 = U_BH) > SCR_Y )
  509.     goto ERROR;
  510.     if ( (x3 = U_CL - 1) >= MAX_X || x3 < 0 )
  511.     goto ERROR;
  512.     if ( (y3 = U_CH - 1) >= SCR_Y || y3 < 0 )
  513.     goto ERROR;
  514.     sx = x2 - x1; sy = y2 - y1;
  515.     if ( sx <= 0 || sy <= 0 )
  516.     goto ERROR;
  517.     if ( (x3 + sx) > MAX_X || (y3 + sy) > SCR_Y )
  518.     goto ERROR;
  519.  
  520.     if ( sp < dp ) {
  521.     sp = (x2 - 1) * 2 + (MAX_X * 2) * (y2 - 1);
  522.     dp = (x3 + sx - 1) * 2 + (MAX_X * 2) * (y3 + sy - 1);
  523.     for ( i = 0 ; i < sy ; i++ ) {
  524.         vramrcpy(dp,sp,sx * 2);
  525.         sp -= (MAX_X * 2);
  526.         dp -= (MAX_X * 2);
  527.     }
  528.     } else {
  529.     sp = x1 * 2 + (MAX_X * 2) * y1;
  530.     dp = x3 * 2 + (MAX_X * 2) * y3;
  531.     for ( i = 0 ; i < sy ; i++ ) {
  532.         vramcpy(dp,sp,sx * 2);
  533.         sp += (MAX_X * 2);
  534.         dp += (MAX_X * 2);
  535.     }
  536.     }
  537.     return;
  538. ERROR:
  539.     U_AH = 0x02;
  540.     U_CF |= 0x0001;
  541. }
  542. void    VDB_18(void)    /* 矩形域消去 */
  543. {
  544.     int     i;
  545.     int     x1,y1,x2,y2;
  546.     int     sx,sy;
  547.     UNSIG   sp;
  548.  
  549.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  550.     goto ERROR;
  551.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  552.     goto ERROR;
  553.     if ( (x2 = U_BL) > MAX_X )
  554.     goto ERROR;
  555.     if ( (y2 = U_BH) > SCR_Y )
  556.     goto ERROR;
  557.     sx = x2 - x1; sy = y2 - y1;
  558.     if ( sx <= 0 || sy <= 0 )
  559.     goto ERROR;
  560.     sp = (x1 * 2 + (MAX_X * 2) * y1);
  561.  
  562.     for ( i = 0 ; i < sy ; i++ ) {
  563.     colset(sp,COLOR,sx * 2);
  564.     sp += (MAX_X * 2);
  565.     }
  566.     return;
  567. ERROR:
  568.     U_AH = 0x02;
  569.     U_CF |= 0x0001;
  570. }
  571. void    VDB_19(void)    /* 全画面スクロ-ル */ 
  572. {
  573.     int     cx,i;
  574.     UNSIG   vp;
  575.  
  576.     if ( (cx = U_CX) == 0 || cx > SCR_Y )
  577.     cx = SCR_Y;
  578.     for ( ; cx > 0 ; cx-- ) {
  579.     switch(U_AL) {
  580.         case 1:    /* 下方向 */
  581.         i = (MAX_X * 2) * (SCR_Y - 1);
  582.         vramrcpy(i + (MAX_X * 2 - 2),i - 2,i);
  583.         colset(0,COLOR,(MAX_X * 2));
  584.         break;
  585.         case 2:    /* 右方向 */
  586.         i = (MAX_X * 2) * SCR_Y - 2;
  587.         vramrcpy(i,i - 2,i);
  588.         vp = 0;
  589.         for ( i = 0 ; i < SCR_Y ; i++ ) {
  590.             colset(vp,COLOR,2);
  591.             vp += (MAX_X * 2);
  592.         }
  593.         break;
  594.         case 3:    /* 左方向 */
  595.         vramcpy(0,2,(MAX_X * 2) * SCR_Y - 2);
  596.         vp = (MAX_X * 2) - 2;
  597.         for ( i = 0 ; i < SCR_Y ; i++ ) {
  598.             colset(vp,COLOR,2);
  599.             vp += (MAX_X * 2);
  600.         }
  601.         break;
  602.             default:     /* case 0 上方向 */
  603.         vramcpy(0,(MAX_X * 2),(MAX_X * 2) * (SCR_Y - 1));
  604.         colset((MAX_X * 2) * (SCR_Y - 1),COLOR,(MAX_X * 2));
  605.         break;
  606.     }
  607.     }
  608. }
  609. void    VDB_1A(void)    /* 部分スクロ-ル */
  610. {
  611.     int     cx,i;
  612.     int     x1,y1,x2,y2;
  613.     int     sx,sy;
  614.     UNSIG   sp;
  615.     UNSIG   vp;
  616.  
  617.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  618.     goto ERROR;
  619.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  620.     goto ERROR;
  621.     if ( (x2 = U_BL) > MAX_X )
  622.     goto ERROR;
  623.     if ( (y2 = U_BH) > SCR_Y )
  624.     goto ERROR;
  625.     sx = x2 - x1; sy = y2 - y1;
  626.     if ( sx <= 0 || sy <= 0 )
  627.     goto ERROR;
  628.     sp = (x1 * 2 + (MAX_X * 2) * y1);
  629.  
  630.     if ( (cx = U_CX) == 0 || cx > sy )
  631.     cx = sy;
  632.     for ( ; cx > 0 ; cx-- ) {
  633.     switch(U_AL) {
  634.         case 1:    /* 下方向 */
  635.         vp = sp + (MAX_X * 2) * (sy - 1);
  636.         for ( i = 0 ; i < (sy-1) ; i++ ) {
  637.             vramcpy(vp,vp - (MAX_X * 2),sx * 2);
  638.             vp -= (MAX_X * 2);
  639.         }
  640.         colset(sp,COLOR,sx * 2);
  641.         break;
  642.         case 2:    /* 右方向 */
  643.         vp = sp + (sx * 2) - 2;
  644.         for ( i = 0 ; i < sy ; i++ ) {
  645.             vramrcpy(vp,vp - 2,sx * 2 - 2);
  646.             vp += (MAX_X * 2);
  647.         }
  648.         vp = sp;
  649.         for ( i = 0 ; i < sy ; i++ ) {
  650.             colset(vp,COLOR,2);
  651.             vp += (MAX_X * 2);
  652.         }
  653.         break;
  654.         case 3:    /* 左方向 */
  655.         vp = sp;
  656.         for ( i = 0 ; i < sy ; i++ ) {
  657.             vramcpy(vp,vp + 2,sx * 2 - 2);
  658.             vp += (MAX_X * 2);
  659.         }
  660.         vp = sp + (sx * 2) - 2;
  661.         for ( i = 0 ; i < sy ; i++ ) {
  662.             colset(vp,COLOR,2);
  663.             vp += (MAX_X * 2);
  664.         }
  665.         break;
  666.             default:     /* case 0 上方向 */
  667.         for ( vp = sp,i = 0 ; i < (sy-1) ; i++ ) {
  668.             vramcpy(vp,vp + (MAX_X * 2),sx * 2);
  669.             vp += (MAX_X * 2);
  670.         }
  671.         colset(vp,COLOR,sx * 2);
  672.         break;
  673.     }
  674.     }
  675.     return;
  676. ERROR:
  677.     U_AH = 0x02;
  678.     U_CF |= 0x0001;
  679. }
  680. void    VDB_1B(void)    /* コンソ-ル機能の設定 */
  681. {
  682.     int     i;
  683.  
  684.     i = COM_MODE;
  685.     COM_MODE = (U_AL & 0xC7) | 0x08;
  686.     if ( (i & 0x40) != (COM_MODE & 0x40) ) {
  687.     if ( (COM_MODE & 0x40) != 0 )
  688.         SCR_Y--;
  689.     else
  690.         SCR_Y++;
  691.     }
  692. }
  693. void    VDB_1C(void)    /* コンソ-ル機能の読み取り */
  694. {
  695.     U_AL = COM_MODE;
  696. }
  697. void    VDB_1D(void)    /* 文字の出力 */
  698. {
  699.     Chr_out(U_AL);
  700. }
  701. void    VDB_1E(void)    /* 文字列の出力 */
  702. {
  703.     int     i;
  704.     union {
  705.     UCHAR far    *p;
  706.     unsigned short  s[2];
  707.     } ptr;
  708.  
  709.     ptr.s[0] = U_DI;
  710.     ptr.s[1] = U_DS;
  711.  
  712.     for ( i = U_CX ; i > 0 ; i-- )
  713.     Chr_out(*(ptr.p++));
  714. }
  715. void    VDB_1F(void)    /* システム行書き込み */
  716. {
  717.     int    ch,cx,at,md;
  718.     union {
  719.     UNSIG far    *p;
  720.     unsigned short  s[2];
  721.     } pp;
  722.     union {
  723.     UCHAR far    *p;
  724.     unsigned short  s[2];
  725.     } cp,vp,ap;
  726.  
  727.     if ( (COM_MODE & 0x40) == 0 )
  728.     return;
  729.  
  730.     pp.s[0] = U_DI;
  731.     pp.s[1] = U_DS;
  732.  
  733.     cp.s[0] = *(pp.p++);
  734.     cp.s[1] = *(pp.p++);
  735.  
  736.     ap.s[0] = *(pp.p++);
  737.     ap.s[1] = *(pp.p++);
  738.  
  739.     vp.s[0] = ((U_DL & 0x7F) - 1) * 2 + (MAX_X * 2) * SCR_Y;
  740.     vp.s[1] = CVRAM;
  741.  
  742.     cx = U_CX;
  743.     for ( ; cx > 0 ; cx-- ) {
  744.     *(vp.p++) = *(cp.p++);
  745.     if ( U_AL != 1 ) {
  746.         at = COLOR;
  747.         md = *(ap.p++);
  748.     } else {
  749.         md = *(ap.p++);
  750.         at = *(ap.p++) & 0x38;
  751.         at |= (*(ap.p++) & 0x07); ap.p++;
  752.     }
  753.     *(vp.p++) = at;
  754.     if ( md == 0x03 ) {
  755.         ch = (*(vp.p-4) << 8) | *(vp.p-2);
  756.         *(vp.p-4) = *(vp.p-2) = DMYKAN;
  757.         *(vp.p-3) |= 0x40;
  758.         vp.s[1] = KVRAM;
  759.         *(vp.p-4) = ch >> 8;
  760.         *(vp.p-3) = ch;
  761.         vp.s[1] = CVRAM;
  762.     }
  763.     }
  764. }
  765. void    VDB_20(void)    /* 背景色の読み取り */
  766. {
  767.     U_DX = BAKCOL;
  768. }
  769. void    VDB_21(void)    /* Ext Func Vram Cheng */
  770. {
  771.     if ( ++DSP_CON >= MAX_CON )
  772.     DSP_CON = 0;
  773.  
  774.     if ( DSP_CON != ACT_CON ) {
  775.     ACT_CVRAM    = consol[DSP_CON].cvram;
  776.     ACT_KVRAM    = consol[DSP_CON].kvram;
  777.     CUR_DISP_X   = consol[DSP_CON].cur_x;
  778.     CUR_DISP_Y   = consol[DSP_CON].cur_y;
  779.     CUR_DISP_OFF = consol[DSP_CON].cur_off;
  780.     CUR_DISP_SIZ = consol[DSP_CON].cur_siz;
  781.     CUR_DISP_FLG = consol[DSP_CON].cur_flg;
  782.     }
  783.  
  784.     CHK_VRAM = 1;
  785. }
  786.  
  787. void    BIOS_91(regset)
  788. register REGSET far *regset;
  789. {
  790.     int     cmd;
  791.     REGSET far  *regs_bak;
  792.     CONPARA    *actv_bak;
  793.     static void (*VDB_table[])()={
  794.     VDB_00,    VDB_01,    VDB_02,    VDB_03,    VDB_04,    VDB_05,    VDB_06,    VDB_07,
  795.     VDB_08,    VDB_09,    VDB_0A,    VDB_0B,    VDB_0C,    VDB_0D,    VDB_0E,    VDB_0F,
  796.     VDB_10,    VDB_11,    VDB_12,    VDB_13,    VDB_14,    VDB_15,    VDB_16,    VDB_17,
  797.     VDB_18,    VDB_19,    VDB_1A,    VDB_1B,    VDB_1C,    VDB_1D,    VDB_1E,    VDB_1F,
  798.     VDB_20, VDB_21 };
  799.  
  800.     regs_bak = regs;
  801.     actv_bak = actv;
  802.  
  803.     regs = regset;
  804.  
  805.     if ( (ACT_CON = U_AH / 0x40) >= MAX_CON )
  806.     goto ERROR;
  807.  
  808.     U_AH %= 0x40;
  809.  
  810.     actv = &(consol[ACT_CON]);
  811.  
  812.     if ( (cmd = U_AH) <= 0x21 ) {
  813.     U_AH = 0;
  814.     U_CF &= 0xFFFE;
  815.     (*VDB_table[cmd])();
  816.     } else
  817.     goto ERROR;
  818.  
  819.     if ( DSP_CON == ACT_CON ) {
  820.     ACT_CVRAM = CVRAM;
  821.     ACT_KVRAM = KVRAM;
  822.     CUR_DISP_X = CUR_X;
  823.     CUR_DISP_Y = CUR_Y;
  824.     CUR_DISP_OFF = CUR_OFF;
  825.     CUR_DISP_SIZ = CUR_SIZ;
  826.     CUR_DISP_FLG = CUR_FLG;
  827.     if ( DSP_CON != 0 )
  828.         CHK_VRAM = 1;
  829.     }
  830.     goto ENDOF;
  831.  
  832. ERROR:
  833.     U_AH = 0x01;
  834.     U_CF |= 0x0001;
  835.  
  836. ENDOF:
  837.     regs = regs_bak;
  838.     actv = actv_bak;
  839.     return;
  840. }
  841. short    Dummy_init(unsigned short seg,unsigned short cs)
  842. {
  843.     actv = &(consol[1]);
  844.     CVRAM = cs + seg;
  845.     seg += 0x0100;
  846.     KVRAM = cs + seg;
  847.     seg += 0x0100;
  848.     VDB_00();
  849.     return seg;
  850. }
  851. void    VDB_init(void)
  852. {
  853.     actv = &(consol[1]);
  854.     VDB_00();
  855. }
  856.